package san.java.day08;

import san.java.inherit_07.Person;
import san.java.inherit_07.Student;

/**
 * java 中的对象类型转换
 *  基本数据类型的Casting:
 *      1. 自动类型转换: 小的数据类型可以自动转换成大的数据类型
 *          如: long g = 20; double d = 12.0f;
 *      2. 强制类型转换: 可能会损失精度
 *          float f = (float)12.0; int a = (int) 1200L;
 *
 *  对Java对象的强制类型转换称为造型
 *      1. 从子类到父类的类型转换可以自动进行
 *      2. 从父类到子类的类型转换必须通过强制类型转换
 *      3. 无继承关系的引用转换是非法的
 */

public class Cast_01 {

    public static void method(Person e) {
        if (e instanceof Student) {
            Student s = (Student) e;
            s.study();
        } else {
            e.work();
        }
    }

    public static void main(String[] args) {
        int i = 1;
        long l = i;

        i = (int) l;  // 强制类型转换

        Student s = new Student();
        Person p = new Person();
        p = s;

        // 父类转换为子类需要强制类型转换
        s = (Student) p;

        // 无继承关系的转换是非法的
        Cast_01 t = new Cast_01();
//        Person p1 = t;

        // Object类
        String str = "hello";
        Object obj = str;
        System.out.println(obj);

        Object obj1 = "hello";
        String str1 = (String) obj1;
        System.out.println(str1);

        // 测试方法调用
        Person p1 = new Person();
        method(p1);
        method(s);
    }
}
